package thread;
/**
 * 售票
 */

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 票界面
 */
public class Ticks {
    private int no;//编号
    private String sj;//时间

    public int getNo() {
        return no;
    }

    public String getSj() {
        return sj;
    }

    public Ticks(int no) {
        this.no=no;
        Date d=new Date();
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy/mm/dd  HH:mm:ss");//格式化日期
        sj=sdf.format(d);
    }

    @Override
    public String toString() {
        return "票{" +
                "编号='" + no + '\'' +
                ", 使用时间='" + sj + '\'' +
                '}';
    }
    /**
     * 测试用的
     */
    /*public static void main(String[] args){
        Ticks t1=new Ticks();
        System.out.println(t1);
    }*/
}

/**
 *线程
 */
    class SailTick extends Thread{
//  class SailTick implements Runnable{
    private List<Ticks> lists;
    private String name;//售票员姓名

    public SailTick(String name,int count) {
        this.name = name;
        lists=new ArrayList<>();
        for (int i=0;i<count;i++){
            lists.add(new Ticks(i+1));
        }
    }

    @Override
    public void run() {
        int c=0;
        /**
         * 加锁：为了防止多个线程同时访问同一个数据
         */
        while (true){
            Ticks t;
            synchronized (lists) {
                if (lists.size()<=0)break;
                t=lists.remove(0);
                c++;
            }
            //System.out.println(name+"卖了"+t);
            System.out.println(Thread.currentThread().getName()+"卖了"+t);//为了显示效果，使用了Thread默认名
            /*try {
                Thread.sleep(300);//线程休眠时间
            } catch (InterruptedException e) {
                e.printStackTrace();
            }*/
        }
        System.out.println(Thread.currentThread().getName()+"卖了"+c+"张!");
    }
}

/**
 * 测试类
 */
class Test{
    public static void main(String[] args){
        SailTick st1=new SailTick("悟空",20);
        /*SailTick st2=new SailTick("八戒",10);
        SailTick st3=new SailTick("和尚",40);
        st1.start();st2.start();st3.start();*/
        /**
         * 线程第二种写法：Runnable()
         *      下面是三个线程实现一个对象st1，不加锁看看会发生什么？
         *      不加锁时，票会被重复买，这是不合理的
         */
        Thread th1=new Thread(st1);
        Thread th2=new Thread(st1);
        Thread th3=new Thread(st1);
        th1.start();th2.start();th3.start();
    }
}
